/**
 * 数据库模型关联同步脚本
 * 用于初始化 Sequelize 模型之间的关联关系
 */

const { sequelize } = require('../src/config/database');
const Product = require('../src/models/Product');
const ProductVideo = require('../src/models/ProductVideo');

/**
 * 初始化模型关联关系
 */
function initializeModelAssociations() {
    const models = {
        Product,
        ProductVideo
    };

    // 初始化关联关系
    Object.keys(models).forEach(modelName => {
        if (models[modelName].associate) {
            models[modelName].associate(models);
        }
    });

    console.log('模型关联关系初始化完成');
}

/**
 * 同步数据库模型
 */
async function syncModels() {
    try {
        console.log('开始同步数据库模型...');

        // 初始化关联关系
        initializeModelAssociations();

        // 同步数据库（不强制重建表）
        await sequelize.sync({ alter: false });

        console.log('数据库模型同步完成！');

    } catch (error) {
        console.error('数据库模型同步失败:', error);
        throw error;
    }
}

/**
 * 强制同步数据库模型（重建表）
 * ⚠️ 警告：这将删除所有数据！
 */
async function forceSyncModels() {
    try {
        console.log('⚠️  警告：开始强制同步数据库模型（将删除所有数据）...');

        // 初始化关联关系
        initializeModelAssociations();

        // 强制同步数据库（重建表）
        await sequelize.sync({ force: true });

        console.log('数据库模型强制同步完成！');

    } catch (error) {
        console.error('数据库模型强制同步失败:', error);
        throw error;
    }
}

/**
 * 测试数据库连接和模型
 */
async function testModels() {
    try {
        console.log('测试数据库连接和模型...');

        // 测试数据库连接
        await sequelize.authenticate();
        console.log('✅ 数据库连接成功');

        // 初始化关联关系
        initializeModelAssociations();

        // 测试模型查询
        const productCount = await Product.count();
        const videoCount = await ProductVideo.count();

        console.log(`✅ 商品数量: ${productCount}`);
        console.log(`✅ 视频数量: ${videoCount}`);

        // 测试关联查询
        const productWithVideos = await Product.findOne({
            include: [{
                model: ProductVideo,
                as: 'videos'
            }]
        });

        if (productWithVideos) {
            console.log(`✅ 关联查询成功，商品 "${productWithVideos.productName}" 有 ${productWithVideos.videos?.length || 0} 个视频`);
        } else {
            console.log('ℹ️  暂无商品数据');
        }

        console.log('模型测试完成！');

    } catch (error) {
        console.error('模型测试失败:', error);
        throw error;
    }
}

// 命令行运行支持
if (require.main === module) {
    const command = process.argv[2];

    switch (command) {
        case 'sync':
            syncModels().finally(() => process.exit(0));
            break;
        case 'force-sync':
            forceSyncModels().finally(() => process.exit(0));
            break;
        case 'test':
            testModels().finally(() => process.exit(0));
            break;
        default:
            console.log('使用说明:');
            console.log('  node database/sync-models.js sync        - 同步模型（保留数据）');
            console.log('  node database/sync-models.js force-sync  - 强制同步模型（删除数据）');
            console.log('  node database/sync-models.js test        - 测试模型和关联');
            process.exit(1);
    }
}

module.exports = {
    initializeModelAssociations,
    syncModels,
    forceSyncModels,
    testModels
};